前面介绍了对ContentProvider的访问,包括增、删、改、查。那么当ContentProvider内容发生改变时,我们也希望应用程序能够做出相应。换句话说,应用程序“监视”着ContentProvider,一旦其内容发生改变(这种改变可能来自ContentProvider自身,也可能来自第三方应用程序),应用程序能够做出反应。
7.4.3.1 ContentObserver 简介
Android系统提供ContentObserver来实现监听功能。实现监听功能包括以下几个步骤:
1、注册。通知Android系统应用程序对于某个Uri感兴趣,如果该Uri对应的ContenProvider数据发生改变,Android系统会自动调用ContentObserver的onChange方法,这非常类似于数据库中触发器。
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
其中uri为需要监听的ContentProvider所对应的Uri。
notifyForDescendents为false时表示精确匹配,为true时表示同时匹配派生的Uri。例如对于Uri内容为“content:\/\/com.sample”来说,当notifyForDescendents为false时仅有“content:\/\/com.sample”同该Uri匹配,但是当notifyForDescendents为true时,则“content:\/\/com.sample”、“content:\/\/com.sample\/path”、“content:\/\/com.sample\/path\/child_path”等均匹配。
2、重写ContentObserver的onChange方法,在此方法读取改变的内容,然后再做进一步地处理。
7.4.3.2 ContentObserver示例
public class MainActivity extends AppCompatActivity {
private final static String TAG="myTag";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,true,
new ContactsObserver(new Handler()));
}
private final class ContactsObserver extends ContentObserver{
public ContactsObserver(Handler handler){super(handler);
}
@Override
public void onChange(boolean selfChange) {
Log.v(TAG,"Contact data is changed.");
}
}